package ar.com.aterrizar.fecha;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import uqbar.arena.persistence.annotations.PersistentClass;
import uqbar.arena.persistence.annotations.PersistentField;

import ar.com.aterrizar.exception.ErrorEnFormatoDeFechaException;


@PersistentClass
public class Fecha {
	private Date fecha;
	public static final String formatoLatinoAmericano = "dd/MM/yyyy HH:mm";
	public static final String formatoIso8601 = "yyyy-MM-dd HH:mm";
	public static final String formatoNorteAmericano = "MM-dd-yyyy HH:mm";
	
	public Fecha(String fechaYHora){
		this.fecha = setFecha(fechaYHora);
	}
	
	public String getFechaStr(){
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		String fechaString = sdf.format(this.fecha);
		return fechaString;
	}
	
	@PersistentField
	public Date getFecha() {
		return this.fecha;
	}
	
	public long diasEntre(Fecha otraFecha) {
		long diferenciaDeDias = this.getFecha().getTime()
				- otraFecha.getFecha().getTime();

		return Math.abs(diferenciaDeDias / (3600 * 24 * 1000));
	}

	public boolean esMenorQue(Fecha otraFecha) {
		return (this.getFecha().compareTo(otraFecha.getFecha()) < 0);
	}

	public Date validarAndSetFecha(String unaFecha, String formatoDeStr){
		
		SimpleDateFormat formatoDelTexto = new SimpleDateFormat(formatoDeStr);
		formatoDelTexto.setLenient(false);
		try {
			this.fecha = formatoDelTexto.parse(unaFecha);
		} catch (ParseException e) {
			throw new ErrorEnFormatoDeFechaException();
		}
		return this.fecha;
		
	}
		
	public Date setFecha(String unaFecha)  {
		String[] formatos = {formatoLatinoAmericano,formatoIso8601,formatoNorteAmericano};
		
		Date fechaParseada = null;
		
		int i = 0;
		while( (fechaParseada == null) && i<3){
			fechaParseada = validarAndSetFecha(unaFecha, formatos[i]);
			i++;
		}
		return fechaParseada;
	}
	
	public long getDia(){
		return (this.fecha.getTime()/86400000);
	}
	
	public static void fechavalida(String fecha) throws ParseException{
		SimpleDateFormat formatoDelTexto = new SimpleDateFormat("dd/MM/yyyy");
		formatoDelTexto.parse(fecha);
	}
}